/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI.table;

import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.AbstractTableModel;
import sistemadeleiloes.model.Leilao;
import sistemadeleiloes.model.Produto;

/**
 *
 * @author William
 */
public class LeilaoTableModel extends AbstractTableModel {

    private final List<Leilao> linhas;
    private final String[] colunas = {"Produto", "Valor Inicial", "Hora de Início"};

    public static final int PRODUTO = 0, VALOR_INICIAL = 1, HORA_INICIO = 2;

    private DateFormat df;

    public LeilaoTableModel() {
        linhas = new LinkedList();
        df = new SimpleDateFormat("dd/MM/yyyy");
    }

    public LeilaoTableModel(List<Leilao> linhas) {
        this.linhas = new LinkedList(linhas);
    }

    @Override
    public int getRowCount() {
        return linhas.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return colunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case PRODUTO:
                return Produto.class;
            case VALOR_INICIAL:
                return String.class;
            case HORA_INICIO:
                return String.class;
            default:
                throw new IndexOutOfBoundsException();
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {

        switch (columnIndex) {
            case PRODUTO:
                return linhas.get(rowIndex).getProduto().getNome();
            case VALOR_INICIAL:
                return "R$ " + linhas.get(rowIndex).getValorInicial();
            case HORA_INICIO:
                if (linhas.get(rowIndex).getDtInicio() != null) {
                    return df.format(linhas.get(rowIndex).getDtInicio());
                } else {
                    return "";
                }
            default:
                throw new IndexOutOfBoundsException();
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Leilao l = linhas.get(rowIndex);
        switch (columnIndex) {
            case PRODUTO:
                l.setProduto((Produto) aValue);
                break;
            case VALOR_INICIAL:
                l.setValorInicial(Double.parseDouble(((String)aValue).replace("R$ ", "")));
                break;
            case HORA_INICIO:
                try {
                    l.setDtInicio(df.parse((String) aValue));
                } catch (ParseException ex) {
                    l.setDtInicio(null);
                }
                break;
            default:
                throw new IndexOutOfBoundsException();

        }
        fireTableCellUpdated(rowIndex, columnIndex);
    }

    public Leilao get(int indexRow) {
        return linhas.get(indexRow);
    }

    public void add(Leilao l) {
        int lastIndex;
        linhas.add(l);
        lastIndex = getRowCount() - 1;

        fireTableRowsInserted(lastIndex, lastIndex);

    }

    public void remove(int indexRow) {
        linhas.remove(indexRow);
        fireTableRowsDeleted(indexRow, indexRow);
    }

    public void addLista(List<Leilao> leiloes) {
        int index = getRowCount();
        linhas.addAll(leiloes);
        fireTableRowsInserted(index, index + leiloes.size());
    }

    public void limpar() {
        linhas.clear();
        fireTableDataChanged();
    }
}
